home *** CD-ROM | disk | FTP | other *** search
- /* tile.h
- a file to produce an antaliased tiling pattern
- */
-
-
-
- /* this function considers a square wave pulse, with a given period and width,
- the width being expressed as a proportion of the period, and so varying between 0 and 1 */
- float integratedpulse ( float x, pulseperiod, pulsewidth;
- output float which, offset)
- {
- float where = x / pulseperiod;
- which = floor(where);
- offset = where - which;
- /* sum up the contribution of all tiles except the present */
- float basetotal = which * pulsewidth;
- float thistile = offset - min(max(0, offset - pulsewidth / 2), 1 - pulsewidth);
- return (thistile + basetotal) * pulseperiod;
- }
-
- /*
- Given the dimensions of a series of tiles, works out which tile we are in, and the
- coordinates within that tile (normalized to the range 0 - 1). It returns a float
- representing a filtered calculation of the extent the current micropolygon lies
- within an edge (1 = all within edge, 0 = all within tile).
- Note that the parameters sedge, tedge give the total width of the edge, so that e.g there
- will be an edge of width sedge / 2 on both the left and right of the tile
- */
-
- float tile( float ss, /* current s texture coordinate */
- tt, /* current t texture coordinate */
- swidth, /* width of tile in s direction */
- twidth, /* width of tile in t direction */
- sfiltwidth, /* size of antalias filter in s direction */
- tfiltwidth, /* size of antalias filter in t direction */
- sedge, /* tile edge in t direction, as a proportion of tile size (0 - 1)*/
- tedge; /* tile edge in s direction, as a proportion of tile size (0 - 1)*/
- output float swhich, /* s coordinate of which tile we are in (an integer) */
- twhich, /* t coordinate of which tile we are in (an integer) */
- soffset, /* s offset within tile (0 - 1) */
- toffset) /* t offset within tile (0 - 1) */
- {
- float sintegral = integratedpulse(ss + sfiltwidth, swidth, sedge, swhich, soffset);
- float tintegral = integratedpulse(tt + tfiltwidth, twidth, tedge, twhich, toffset);
- sintegral = abs(sintegral - integratedpulse(ss, swidth, sedge, swhich, soffset))
- /sfiltwidth;
- tintegral = abs(tintegral - integratedpulse(tt, twidth, tedge, twhich, toffset))
- /tfiltwidth;
- /*printf("soffset = %f\tsfiltwidth = %f\tsintegral = %f\n",soffset,sfiltwidth, sintegral); */
- return max(sintegral, tintegral);
- }
-
-